/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.seguridad.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.bean.BitacoraInventario;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.bean.BitacoraAnulacion;
import sv.com.intesal.seguridad.sql.SQLBitacora;

/**
 *
 * @author JM
 */
public class BitacoraControlador {

    /*DEVOLUCION MATERIAL PROYECTO*/
    public static final String anulacionDevolucionProyecto = "ANULACIÓN DE DEVOLUCIÓN MATERIAL POR PROYECTO";
    public static final String eliminarItemDevolucionProyecto = "ELIMINACIÓN DE ITEM DEVOLUCIÓN MATERIAL POR PROYECTO";
    public static final String ingresarDevolucionProyecto = "DEVOLUCIÓN MATERIAL POR PROYECTO";

    /*SALIDA MATERIAL PROYECTO*/
    public static final String anulacionSalidaProyecto = "ANULACIÓN DE SALIDA MATERIAL POR PROYECTO";
    public static final String eliminarItemSalidaProyecto = "ELIMINACIÓN DE ITEM SALIDA MATERIAL POR PROYECTO";
    public static final String ingresarSalidaProyecto = "SALIDA MATERIAL POR PROYECTO";

    /*UTILIZACION MATERIAL PROYECTO*/
    public static final String anulacionUtilizacionProyecto = "ANULACIÓN DE UTILIZACIÓN MATERIAL POR PROYECTO";
    public static final String eliminarItemUtilizacionProyecto = "ELIMINACIÓN DE ITEM UTILIZACIÓN MATERIAL POR PROYECTO";
    public static final String ingresarUtilizacionProyecto = "UTILIZACIÓN MATERIAL POR PROYECTO";

    /*AJUSTE*/
    public static final String anulacionAjuste = "ANULACIÓN DE AJUSTE";
    public static final String eliminarItemAjuste = "ELIMINACIÓN DE ITEM AJUSTE";
    public static final String ingresarAjuste = "AJUSTE";

    /*SOLICITUD MATERIAL*/
    public static final String ingresarSolicitudMaterial = "SOLICITUD MATERIAL";
    public static final String anulacionSolicitudMaterial = "ANULACIÓN SOLICITUD MATERIAL";
    public static final String eliminarItemSolicitudMaterial = "ELIMINACIÓN DE ITEM SOLICITUD MATERIAL";

    /*ORDEN DE COMPRA*/
    public static final String ingresarOrdenCompra = "ORDEN DE COMPRA";
    public static final String anulacionOrdenCompra = "ANULACIÓN ORDEN DE COMPRA";
    public static final String eliminarItemOrdenCompra = "ELIMINACIÓN DE ITEM ORDEN DE COMPRA";
    public static final String denegarOrdenCompra = "DENEGAR ORDEN DE COMPRA";

    /*COMPRA*/
    public static final String ingresarCompra = "COMPRA";
    public static final String anulacionCompra = "ANULACIÓN DE COMPRA";
    public static final String eliminarItemCompra = "ELIMINACIÓN DE ITEM COMPRA";

    /*DEVOLUCION COMPRA*/
    public static final String ingresarDevolucionCompra = "DEVOLUCIÓN COMPRA";
    public static final String anulacionDevolucionCompra = "ANULACIÓN DEVOLUCIÓN COMPRA";
    public static final String eliminarItemDevolucionCompra = "ELIMINACIÓN DE ITEM DEVOLUCIÓN COMPRA";
    /*ABONO_COMPRA*/
    public static final String eliminarItemAbonoCompra = "ELIMINACIÓN DE ITEM ABONO COMPRA";

    public void setBitacoraInventario(Integer id_dm, Double cantidad_anterior, Double cantidad_e, Double cantidad_s, Double cantidad_n, String tipo_bi, String numero_documento, Integer codigo_proceso, String tipo_proceso) throws Exception {

        PreparedStatement ps = null;
        Connection cnn = null;
        SessionControlador sc = new SessionControlador();
        try {
            cnn = cConexion.conectar();

            ps = cnn.prepareStatement(SQLBitacora.setBitacoraInventario);

            ps.setInt(1, id_dm);
            ps.setDouble(2, cantidad_anterior);
            ps.setDouble(3, cantidad_e);
            ps.setDouble(4, cantidad_s);
            ps.setDouble(5, cantidad_n);
            ps.setString(6, tipo_bi);
            ps.setString(7, tipo_proceso);
            ps.setInt(8, codigo_proceso);
            ps.setInt(9, sc.getCodigo_Usuario());
            ps.executeUpdate();

            ps.close();
            //cnn.close();
        } catch (Exception ex) {
            System.out.println("ERORR BITACORA INVENTARIO");
            throw new Exception(ex);
        }
    }

    public void setBitacoraAnulacion(Integer codigo_proceso, String tipo_proceso, String tipo_ba) throws Exception {

        PreparedStatement ps = null;
        Connection cnn = null;
        SessionControlador sc = new SessionControlador();
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLBitacora.setBitacoraAnulacion);

            ps.setInt(1, sc.getCodigo_Usuario());
            ps.setString(2, tipo_ba); //COMPRA, FACTURACION, NC,AJUSTE
            ps.setString(3, tipo_proceso); //COMPRA: 4425, ETC
            ps.setInt(4, codigo_proceso);
            ps.executeUpdate();

            ps.close();
            //cnn.close();
        } catch (Exception e) {
            System.out.println("error BITACORA ANULACION");
            throw new Exception(e);
        }
    }

    public List<BitacoraAnulacion> getBitacoraAnulacion(BitacoraAnulacion b) throws Exception {
        List<BitacoraAnulacion> lista = new ArrayList<BitacoraAnulacion>();

        ResultSet rs = null;
        try {

            String var_fechas = this.getFiltro_BA_fechas(b);
            String var_usuario = " and u.id_u=" + b.getId_u() + " ";

            if (b.getId_u() == null) {
                var_usuario = " "; //trae todos los usuarios.
            }

            String sql = "select ba.*,u.usuario_u,e.id_e,e.nombre_e,e.apellido_e from bitacora_anulacion as ba,USUARIO as u, EMPLEADO as e where u.id_u=ba.id_u and e.id_e=u.id_e " + var_usuario + var_fechas + "  order by u.id_u,ba.tipo_ba,ba.fecha_ba,ba.fechahora";
            rs = cConexion.conectar().prepareStatement(sql).executeQuery();
            while (rs.next()) {
                BitacoraAnulacion ba = new BitacoraAnulacion();

                /*BITACORA_ANULACION*/
                ba.setCodigo_ba(rs.getInt("codigo_ba"));
                ba.setFecha_ba(rs.getDate("fecha_ba"));
                ba.setFechahora(rs.getTimestamp("fechahora"));
                ba.setTipo_ba(rs.getString("tipo_ba"));
                ba.setCodigo_documento_ba(rs.getString("codigo_documento_ba"));
                ba.setCodigo_proceso_ba(rs.getInt("codigo_proceso_ba"));

                /*USUARIO*/
                ba.setId_u(rs.getInt("id_u"));
                ba.setUsuario_u(rs.getString("usuario_u"));

                /*EMPLEADO*/
                ba.setCodigo_e(rs.getInt("id_e"));
                ba.setApellido_e(rs.getString("apellido_e"));
                ba.setNombre_e(rs.getString("nombre_e"));
                ba.setNombre_completo_e(rs.getString("nombre_e") + " " + rs.getString("apellido_e"));

                lista.add(ba);
            }
            rs.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<BitacoraInventario> getBitacoraInventario(BitacoraInventario b) throws Exception {
        List<BitacoraInventario> lista = new ArrayList<BitacoraInventario>();

        ResultSet rs = null;
        try {
            String var_fechas = this.getFiltro_BI_fechas(b);
            String var_categoria = this.getFiltro_BI_categoria_subcategoria(b);

            String var_usuario = " and u.id_u=" + b.getId_u() + " ";
            String var_sucursal = " "; // no se ha implementado todavia.

            if (b.getId_u() == null) {
                var_usuario = " "; //trae todos los usuarios.
            }

            String filtro = " ";
            filtro = var_usuario + var_categoria + var_fechas + var_sucursal;
            String sql = "select bi.*,u.usuario_u,e.id_e,e.nombre_e,e.apellido_e,s.nombre_s,s.codigo_s,m.nombre_m,m.descripcion_m,m.id_m,m.codigo_barra_m,m.codigo_barra_original_m  ,cat.id_cat,cat.nombre_cat,sc.id_su,sc.nombre_su from bitacora_inventario as bi,USUARIO as u, EMPLEADO as e,MATERIAL as m,MATERIAL_SUCURSAL as ms,SUCURSAL as s ,CATEGORIA as cat,SUB_CATEGORIA as sc where u.id_u=bi.id_u and e.id_e=u.id_e and m.id_m=ms.id_m and ms.id_dm=bi.id_dm and s.codigo_s=ms.codigo_s and cat.id_cat=sc.id_cat and sc.id_su=m.id_su " + filtro + " order by s.nombre_s,m.nombre_m,bi.fecha_bi,bi.fechahora";

            //System.out.println(sql);
            rs = cConexion.conectar().prepareStatement(sql).executeQuery();
            while (rs.next()) {
                BitacoraInventario bi = new BitacoraInventario();

                /*BITACORA INVENTARIO*/
                bi.setCodigo_bi(rs.getInt("codigo_bi"));
                bi.setFecha_bi(rs.getDate("fecha_bi"));
                bi.setFechahora(rs.getTimestamp("fechahora"));
                bi.setTipo_proceso_bi(rs.getString("tipo_proceso_bi")); // TIPO DE PROCESO: COMPRA, AJUSTE, SALIDA_PROYECTO
                bi.setTipo_bi(rs.getString("tipo_bi"));
                bi.setCodigo_proceso_bi(rs.getInt("codigo_proceso_bi"));

                bi.setCantidad_anterior_bi(rs.getDouble("cantidad_anterior_bi"));
                bi.setCantidad_entrada_bi(rs.getDouble("cantidad_entrada_bi"));
                bi.setCantidad_salida_bi(rs.getDouble("cantidad_salida_bi"));
                bi.setCantidad_nueva_bi(rs.getDouble("cantidad_nueva_bi"));

                /* CATEGORIA Y SUBCATEGORIA */
                bi.setId_cat(rs.getInt("id_cat"));
                bi.setNombre_cat(rs.getString("nombre_cat"));
                bi.setNombre_su(rs.getString("nombre_su"));
                bi.setId_su(rs.getInt("id_su"));

                /*SUCURSAL*/
                bi.setNombre_s(rs.getString("nombre_s"));
                bi.setCodigo_s(rs.getInt("codigo_s"));

                /*USUARIO*/
                bi.setId_u(rs.getInt("id_u"));
                bi.setUsuario_u(rs.getString("usuario_u"));

                /*MATERIAL*/
                bi.setId_m(rs.getInt("id_m"));
                bi.setNombre_m(rs.getString("nombre_m"));
                bi.setDescripcion_m(rs.getString("descripcion_m"));
                bi.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                bi.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                bi.setId_dm(rs.getInt("id_dm"));
                lista.add(bi);
            }
            rs.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<BitacoraInventario> getEncaBitacoraInventario(BitacoraInventario b) throws Exception {
        List<BitacoraInventario> lista = new ArrayList<BitacoraInventario>();

        ResultSet rs = null;
        try {

            String var_usuario = " and u.id_u=" + b.getId_u() + " ";
            String var_categoria = this.getFiltro_BI_categoria_subcategoria(b);

            SessionControlador sc = new SessionControlador();
            String var_sucursal = " and s.codigo_s=" + sc.getCodigo_Sucursal() + " ";

            if (b.getId_u() == null) {
                var_usuario = " "; //trae todos los usuarios.
            }

            if (b.getFlagVisible_Sucursal() != null) {
                var_sucursal = " and s.codigo_s=" + b.getCodigo_s() + " ";
            }

            String filtro = " ";
            filtro = var_usuario + var_categoria + var_sucursal;
            String sql = "select ms.id_dm,s.nombre_s,s.codigo_s,m.nombre_m,m.descripcion_m,m.id_m,m.codigo_barra_m,m.codigo_barra_original_m  ,cat.id_cat,cat.nombre_cat,sc.id_su,sc.nombre_su from MATERIAL as m,MATERIAL_SUCURSAL as ms,SUCURSAL as s ,CATEGORIA as cat,SUB_CATEGORIA as sc where m.id_m=ms.id_m and s.codigo_s=ms.codigo_s and cat.id_cat=sc.id_cat and sc.id_su=m.id_su " + filtro + " order by s.nombre_s,cat.nombre_cat,sc.nombre_su,m.nombre_m";

            rs = cConexion.conectar().prepareStatement(sql).executeQuery();
            while (rs.next()) {
                BitacoraInventario bi = new BitacoraInventario();

                /* CATEGORIA Y SUBCATEGORIA */
                bi.setId_cat(rs.getInt("id_cat"));
                bi.setNombre_cat(rs.getString("nombre_cat"));
                bi.setNombre_su(rs.getString("nombre_su"));
                bi.setId_su(rs.getInt("id_su"));

                /*SUCURSAL*/
                bi.setNombre_s(rs.getString("nombre_s"));
                bi.setCodigo_s(rs.getInt("codigo_s"));

                /*MATERIAL*/
                bi.setId_m(rs.getInt("id_m"));
                bi.setNombre_m(rs.getString("nombre_m"));
                bi.setDescripcion_m(rs.getString("descripcion_m"));
                bi.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                bi.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                bi.setId_dm(rs.getInt("id_dm"));
                lista.add(bi);
            }
            rs.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<BitacoraInventario> getDetaBitacoraInventario(BitacoraInventario b) throws Exception {
        List<BitacoraInventario> lista = new ArrayList<BitacoraInventario>();

        ResultSet rs = null;
        Connection cnn = null;
        PreparedStatement ps = null;
        try {

            String var_fechas = this.getFiltro_BI_fechas(b);

            String sql = "select bi.*,u.usuario_u,e.id_e,e.nombre_e,e.apellido_e,s.nombre_s,s.codigo_s,m.nombre_m,m.descripcion_m,m.codigo_barra_m,m.codigo_barra_original_m  ,cat.id_cat,cat.nombre_cat,sc.id_su,sc.nombre_su from bitacora_inventario as bi,USUARIO as u, EMPLEADO as e,MATERIAL as m,MATERIAL_SUCURSAL as ms,SUCURSAL as s ,CATEGORIA as cat,SUB_CATEGORIA as sc where u.id_u=bi.id_u and e.id_e=u.id_e and m.id_m=ms.id_m and ms.id_dm=bi.id_dm and s.codigo_s=ms.codigo_s and cat.id_cat=sc.id_cat and sc.id_su=m.id_su and ms.id_dm=? " + var_fechas + " order by s.nombre_s,m.nombre_m,bi.fecha_bi,bi.fechahora";
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(sql);
            ps.setInt(1, b.getId_dm());
            rs = ps.executeQuery();


            while (rs.next()) {
                BitacoraInventario bi = new BitacoraInventario();

                /*BITACORA INVENTARIO*/
                bi.setCodigo_bi(rs.getInt("codigo_bi"));
                bi.setFecha_bi(rs.getDate("fecha_bi"));
                bi.setFechahora(rs.getTimestamp("fechahora"));
                bi.setTipo_proceso_bi(rs.getString("tipo_proceso_bi")); // TIPO DE PROCESO: COMPRA, AJUSTE, SALIDA_PROYECTO
                bi.setTipo_bi(rs.getString("tipo_bi"));
                bi.setCodigo_proceso_bi(rs.getInt("codigo_proceso_bi"));

                bi.setCantidad_anterior_bi(rs.getDouble("cantidad_anterior_bi"));
                bi.setCantidad_entrada_bi(rs.getDouble("cantidad_entrada_bi"));
                bi.setCantidad_salida_bi(rs.getDouble("cantidad_salida_bi"));
                bi.setCantidad_nueva_bi(rs.getDouble("cantidad_nueva_bi"));

                /* CATEGORIA Y SUBCATEGORIA */
                bi.setId_cat(rs.getInt("id_cat"));
                bi.setNombre_cat(rs.getString("nombre_cat"));
                bi.setNombre_su(rs.getString("nombre_su"));
                bi.setId_su(rs.getInt("id_su"));

                /*SUCURSAL*/
                bi.setNombre_s(rs.getString("nombre_s"));
                bi.setCodigo_s(rs.getInt("codigo_s"));

                /*USUARIO*/
                bi.setId_u(rs.getInt("id_u"));
                bi.setUsuario_u(rs.getString("usuario_u"));

                /*MATERIAL*/
                bi.setNombre_m(rs.getString("nombre_m"));
                bi.setDescripcion_m(rs.getString("descripcion_m"));
                bi.setCodigo_barra_m(rs.getString("codigo_barra_m"));
                bi.setCodigo_barra_original_m(rs.getString("codigo_barra_original_m"));

                /*MATERIAL_SUCURSAL*/
                bi.setId_dm(rs.getInt("id_dm"));

                lista.add(bi);
            }
            rs.close();
            cnn.close();
            ps.close();

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    /*REPORTE DE BITACORA DE INVENTARIOS Y ANULACION*/
    public void generarReporte_BitacoraAnulaciones(BitacoraAnulacion b) throws Exception {

        try {

            String var_fechas = this.getFiltro_BA_fechas(b);
            String var_usuario = " and u.id_u=" + b.getId_u() + " ";

            if (b.getId_u() == null) {
                var_usuario = " "; //trae todos los usuarios.
            }

            String sql = "select ba.fecha_ba,ba.fechahora,ba.tipo_ba,ba.codigo_documento_ba,u.usuario_u,(e.nombre_e || ' ' || e.apellido_e) as nombre  from bitacora_anulacion as ba,USUARIO as u,EMPLEADO as e where u.id_u=ba.id_u and e.id_e=u.id_e " + var_usuario + var_fechas + " group by ba.fecha_ba,ba.fechahora,ba.tipo_ba,ba.codigo_documento_ba,u.usuario_u,nombre order by u.usuario_u,ba.tipo_ba,ba.fecha_ba,ba.fechahora";
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_BitacoraInventario_x_Producto(BitacoraInventario b) throws Exception {
        try {

            String var_fechas = this.getFiltro_BI_fechas(b);
            String var_categoria = this.getFiltro_BI_categoria_subcategoria(b);
            String var_producto = " ";

            if (b.getId_m() != null) {
                var_producto = " and m.nombre_m like '%" + b.getNombre_m() + "%' ";
            }
            if (b.getId_dm() == null) {
                var_producto = " and ms.id_dm=" + b.getId_dm() + " ";
            }

            String sql = "select bi.fecha_bi,bi.fechahora,bi.cantidad_anterior_bi,bi.cantidad_salida_bi,bi.cantidad_entrada_bi,bi.cantidad_nueva_bi,bi.tipo_bi,bi.tipo_proceso_bi,u.usuario_u,(e.nombre_e || ' ' || e.apellido_e) nombre,s.nombre_s,m.nombre_m,m.descripcion_m,m.codigo_barra_m,m.codigo_barra_original_m,cat.nombre_cat,sc.nombre_su from bitacora_inventario as bi,USUARIO as u, EMPLEADO as e,MATERIAL as m,MATERIAL_SUCURSAL as ms,SUCURSAL as s ,CATEGORIA as cat,SUB_CATEGORIA as sc where u.id_u=bi.id_u and e.id_e=u.id_e and m.id_m=ms.id_m and ms.id_dm=bi.id_dm and s.codigo_s=ms.codigo_s and cat.id_cat=sc.id_cat and sc.id_su=m.id_su " + var_categoria + var_producto + var_fechas + " order by s.nombre_s,m.nombre_m,bi.fecha_bi,bi.fechahora ";
            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_BA_fechas(BitacoraAnulacion b) throws Exception{
        try {
            String var_fechas = " ";
            if (b.getFecha_i() != null && b.getFecha_f() == null) {
                var_fechas = " and ba.fecha_ba >='" + cVarios.getFecha(b.getFecha_i()) + "' ";
            } else if (b.getFecha_f() != null && b.getFecha_i() == null) {
                var_fechas = " and ba.fecha_ba <='" +  cVarios.getFecha(b.getFecha_f()) + "' ";
            } else if (b.getFecha_i() == null && b.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and ba.fecha_ba between '" +  cVarios.getFecha(b.getFecha_i()) + "' and '" +  cVarios.getFecha(b.getFecha_i()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_BI_fechas(BitacoraInventario b) throws Exception{
        try {
            String var_fechas = " ";
            if (b.getFecha_i() != null && b.getFecha_f() == null) {
                var_fechas = " and bi.fecha_bi >='" + cVarios.getFecha(b.getFecha_i()) + "' ";
            } else if (b.getFecha_f() != null && b.getFecha_i() == null) {
                var_fechas = " and bi.fecha_bi <='" + cVarios.getFecha(b.getFecha_f()) + "' ";
            } else if (b.getFecha_i() == null && b.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and bi.fecha_bi between '" + cVarios.getFecha(b.getFecha_i()) + "' and '" + cVarios.getFecha(b.getFecha_f()) + "' ";
            }
            return var_fechas;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_BI_categoria_subcategoria(BitacoraInventario b) {
        try {
            String var_categoria = " ", var_subCategoria = " ";
            if (b.getFlagVisible_Categoria() == true && b.getFlagVisible_SubCategoria() == true) {
                var_categoria = " and cat.id_cat=" + b.getId_cat() + " ";
                var_subCategoria = " and sc.id_su=" + b.getId_su() + " ";
            } else if (b.getFlagVisible_Categoria() == true) {
                var_categoria = " and cat.id_cat=" + b.getId_cat() + " ";
            } else if (b.getFlagVisible_SubCategoria() == true) {
                var_subCategoria = " and sc.id_su=" + b.getId_su() + " ";
            }
            return var_categoria + var_subCategoria;
        } catch (Exception e) {
            return " ";
        }
    }
}
